package com.chhuang.core.node;

import cn.hutool.core.collection.CollectionUtil;

import java.io.Serializable;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @Description 合并节点类型
 * @Author Darren Huang
 * @Date 2024-03-15 9:14
 */
public class NodeMergerUtil {

    /**
     * list转成树， 没有type值时，注意如果子节点与父节点的id可能相同不能用，会有问题
     *
     * @param treeList 树列表
     * @param parentId 父id
     * @return {@link List}<{@link T}>
     */
    public static <T extends BaseNode<PK>, PK extends Serializable> List<T> streamToTree(List<T> treeList, PK parentId) {
        if (CollectionUtil.isEmpty(treeList)) {
            return null;
        } else {
            return treeList.stream()
                    // 过滤父节点
                    .filter(parent -> Objects.equals(parent.getParentId(), parentId))
                    // 把父节点children递归赋值成为子节点
                    .peek(child -> {
                        List<T> childTreeList = treeList.stream()
                                .filter(node -> !node.equals(child) || !Objects.equals(node.getType(), child.getType()))
                                .collect(Collectors.toList());

                        child.setChildren(streamToTree(childTreeList, child.getId()));
                    }).collect(Collectors.toList());
        }
    }

}
